/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package models.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import models.entity.Perfil;
import models.entity.Usuario;
import utilidades.DataBaseInstance;

/**
 *
 * @author hmardones
 */
public class UsuarioDao {
    
   
     //***//
     public List<Usuario> getUsuario(){
        List<Usuario> listaUsuarios = new LinkedList<Usuario>();
        ResultSet result = null;
     try {

            String query = "select "
                        + " u.RUT_USUARIO,"
                        + " u.CONTRASENA_USUARIO,"
                        + " u.NOMBRE,"
                        + " u.APELLIDOS,"
                        + " u.TELEFONO,"
                        + " u.EMAIL,"
                        + " u.ID_TIPO_USUARIO,"
                        + " u.DIRECCION,"
                        + " p.DESCRIPCION "
                    + "from "
                        + " USUARIO u,"
                        + " PERFIL p "
                    + "where "
                        + " u.ID_TIPO_USUARIO=p.ID_TIPO_USUARIO";
            
            Connection conn  = DataBaseInstance.getInstanceConnection();
            Statement stmt = conn.createStatement();
            result = stmt.executeQuery(query);
            Usuario usuario;
            Perfil perfil;
            while (result.next()) {
                usuario=new Usuario();
                perfil=new Perfil();
                usuario.setRut(result.getString("RUT_USUARIO"));
                usuario.setClave(result.getString("CONTRASENA_USUARIO"));
                usuario.setNombre(result.getString("NOMBRE"));
                usuario.setApellido(result.getString("APELLIDOS"));
                usuario.setTelefono(result.getString("TELEFONO"));
                usuario.setEmail(result.getString("EMAIL"));
                usuario.setDireccion(result.getString("DIRECCION"));
                perfil.setId_tipo_usuario(result.getInt("TIPO_USUARIO"));
                perfil.setDescripcion(result.getString("DESCRIPCION"));
                usuario.setTipo(perfil);
                listaUsuarios.add(usuario);
            }
            result.close();
            stmt.close();
            DataBaseInstance.closeConnection(conn);

        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return listaUsuarios;
    }
     public Usuario findById(String id) {
        ResultSet result = null;
        Usuario usuario = null;

        try {
            // Componemos la sentencia SQL para obtener los productos.
            String query = "SELECT "
                        + " u.RUT_USUARIO," 
                        + " u.CONTRASENA_USUARIO," 
                        + " u.NOMBRE,u.APELLIDOS," 
                        + " u.TELEFONO,"
                        + " u.EMAIL," 
                        + " u.ID_TIPO_USUARIO"
                        + " u.DIRECCION,"
                        + " p.DESCRIPCION "
                    + "FROM "
                        + "USUARIO u,"
                        + "PERFIL p "
                    + "WHERE "
                        + " u.ID_TIPO_USUARIO=p.ID_TIPO_USUARIO "
                        + " RUT_USUARIO= ?";

            // Ejecutamos la query y obtenemos el resultado.
            Connection conn = DataBaseInstance.getInstanceConnection();
            PreparedStatement stmt = conn.prepareStatement(query);
            stmt.setString(1,id);
            result = stmt.executeQuery();

            // Vemos si no ha devuelto ningun resultado.
            Perfil perfil;
            while (result.next()) {
                usuario=new Usuario();
                perfil=new Perfil();
                usuario.setRut(result.getString("RUT_USUARIO"));
                usuario.setClave(result.getString("CONTRASENA_USUARIO"));
                usuario.setNombre(result.getString("NOMBRE"));
                usuario.setApellido(result.getString("APELLIDOS"));
                usuario.setTelefono(result.getString("TELEFONO"));
                usuario.setEmail(result.getString("EMAIL"));
                usuario.setDireccion(result.getString("DIRECCION"));
                perfil.setId_tipo_usuario(result.getInt("TIPO_USUARIO"));
                perfil.setDescripcion(result.getString("DESCRIPCION"));
                usuario.setTipo(perfil);
            }
            result.close();
            stmt.close();
            DataBaseInstance.closeConnection(conn);

        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }

        return usuario;
    }
     public void Insertar(Usuario usuario) {
        Perfil perfil=usuario.getTtipo();
        PreparedStatement saveUsuario;
        try {
                Connection conn = DataBaseInstance.getInstanceConnection();
                saveUsuario = conn.prepareStatement(
                        "INSERT INTO USUARIO (rut_usuario,"
                                            + " contrasena_usuario,"
                                            + " nombre,"
                                            + " apellidos,"
                                            + " telefono,"
                                            + " email,"
                                            + " id_tipo_usuario,"
                                            + " direccion)"
                        + "VALUES (?, ?, ?,?,?,?,?,?)");
                saveUsuario.setString(1,usuario.getRut());
                saveUsuario.setString(2,usuario.getClave());
                saveUsuario.setString(3, usuario.getNombre());
                saveUsuario.setString(4, usuario.getApellido());
                saveUsuario.setString(5, usuario.getTelefono());
                saveUsuario.setString(6,usuario.getEmail());
                saveUsuario.setInt(7,perfil.getId_tipo_usuario());
                saveUsuario.setString(8,usuario.getDireccion());
                
                System.out.println("INSERT INTO ....");         

            saveUsuario.executeUpdate();
            DataBaseInstance.closeConnection(conn);
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }
     public void actualizar(Usuario usuario) {
        Perfil perfil=new Perfil();
        PreparedStatement saveUsuario;
        try {
              Connection conn = DataBaseInstance.getInstanceConnection();
                saveUsuario = conn.prepareStatement(
                        "UPDATE VEHICULOS SET "
                                    + " contrasena_usuario = ?,"
                                    + " nombre = ?,"
                                    + " apellidos = ?,"
                                    + " telefono=?,"
                                    + " email=?,"
                                    + " id_tipo_usuario=?,"
                                    + " direccion=? "
                                + "WHERE  "
                                    + " rut_usuario = ?");                

                saveUsuario.setString(1,usuario.getClave());
                saveUsuario.setString(2, usuario.getNombre());
                saveUsuario.setString(3, usuario.getApellido());
                saveUsuario.setString(4, usuario.getTelefono());
                saveUsuario.setString(5,usuario.getEmail());
                saveUsuario.setInt(6,perfil.getId_tipo_usuario());
                saveUsuario.setString(7,usuario.getDireccion());
                saveUsuario.setString(8,usuario.getRut());
            

            saveUsuario.executeUpdate();
            DataBaseInstance.closeConnection(conn);
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }
    public void delete(Usuario usuario) {
        PreparedStatement saveProduct;
        try {
              Connection conn = DataBaseInstance.getInstanceConnection();
                saveProduct = conn.prepareStatement(
                        "DELETE FROM USUARIO WHERE rut_usuario = ?");

                saveProduct.setString(1, usuario.getRut());
                saveProduct.executeUpdate(); 
                
            DataBaseInstance.closeConnection(conn);
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }
    public Usuario login(String rut,String contrasena) {
        ResultSet result = null;
        Usuario usuario = null;

        try {
            // Componemos la sentencia SQL para obtener los productos.
            String query = 
                    "SELECT "
                        + " u.RUT_USUARIO," 
                        + " u.CONTRASENA_USUARIO," 
                        + " u.NOMBRE,"
                        + " u.APELLIDOS," 
                        + " u.TELEFONO,"
                        + " u.EMAIL," 
                        + " u.ID_TIPO_USUARIO,"
                        + " u.DIRECCION,"
                        + " p.DESCRIPCION "
                    + "FROM "
                        + "USUARIO u,"
                        + "PERFIL p "
                    + "WHERE RUT_USUARIO= ? AND contrasena_usuario=?";

            // Ejecutamos la query y obtenemos el resultado.
            Connection conn = DataBaseInstance.getInstanceConnection();
            PreparedStatement stmt = conn.prepareStatement(query);
            stmt.setString(1,rut);
            stmt.setString(2,contrasena);
            result = stmt.executeQuery();

            // Vemos si no ha devuelto ningun resultado.
            Perfil perfil;
            while (result.next()) {
                usuario=new Usuario();
                perfil=new Perfil();
                usuario.setRut(result.getString("RUT_USUARIO"));
                usuario.setClave(result.getString("CONTRASENA_USUARIO"));
                usuario.setNombre(result.getString("NOMBRE"));
                usuario.setApellido(result.getString("APELLIDOS"));
                usuario.setTelefono(result.getString("TELEFONO"));
                usuario.setEmail(result.getString("EMAIL"));
                usuario.setDireccion(result.getString("DIRECCION"));
                perfil.setId_tipo_usuario(result.getInt("ID_TIPO_USUARIO"));
                perfil.setDescripcion(result.getString("DESCRIPCION"));
                usuario.setTipo(perfil);
            }
            result.close();
            stmt.close();
            DataBaseInstance.closeConnection(conn);

        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.: login");
            System.err.println(se.getMessage());
        }

        return usuario;
    }
}
